package bszt.xiecheng;

import java.util.*;

public class Code04 {

    /**
     * 题目描述
     * 卢小姐拿到了一棵n个节点的树，每个节点上都有一个数字（0到9之间）
     * 现在卢小姐定义f(i)为：以i号节点为起点时，选择一条路径，使得路径上的数字拼接起来能被3整除的方案数。注意前导零也是合法的
     * 现在卢小姐希望你能帮她求出f(1)到f(n)的值
     * <p></p>
     * 输入格式
     * 第一行包含一个正整数n，表示树的节点数
     * 第二行包含n个整数，第i个数表示i号节点上的数字
     * 接下来n-1行，每行包含两个正整数u和v，表示u号节点和v号节点之间有一条边
     * <p></p>
     * 输出格式
     * 输出共n行，第i行输出f(i)的值
     */

    static List<List<Integer>> tree;
    static int[] a;
    static int n;
    static long[] f;
    static int[][] dp;
    static Map<Integer, int[]> mp = new HashMap<>();

    private static int[] dfs(int node, int parent) {
        int[] cnt = new int[3];
        cnt[a[node] % 3] = 1;
        for (int child : tree.get(node)) {
            if (child != parent) {
                int[] t = dfs(child, node);
                for (int j = 0; j < 3; j++) {
                    cnt[(j + a[node] % 3) % 3] += t[j];
                }
            }
        }
        mp.put(node, cnt);
        return cnt;
    }

    private static void reroot(int node, int parent) {
        f[node] = mp.get(node)[0];
        for (int child : tree.get(node)) {
            if (child != parent) {
                int[] t = new int[3];
                int[] k = new int[3];
                int[] z = new int[3];

                int[] childCnt = mp.get(child);
                int[] nodeCnt = mp.get(node);

                for (int j = 0; j < 3; j++) {
                    z[j] = childCnt[(j - a[node] + 3) % 3];
                    t[j] = nodeCnt[j] - z[j];
                    k[(j + a[child] % 3) % 3] = t[j];
                }

                for (int j = 0; j < 3; j++) {
                    childCnt[j] += k[j];
                }
                mp.put(child, childCnt);
                reroot(child, node);
            }
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        tree = new ArrayList<>();
        a = new int[n + 1];
        f = new long[n + 1];
        dp = new int[n + 1][3];

        for (int i = 0; i <= n; i++) {
            tree.add(new ArrayList<>());
        }

        for (int i = 1; i <= n; i++) {
            a[i] = scanner.nextInt() % 3;
        }

        for (int i = 0; i < n - 1; i++) {
            int u = scanner.nextInt();
            int v = scanner.nextInt();
            tree.get(u).add(v);
            tree.get(v).add(u);
        }

        dfs(1, -1);
        reroot(1, -1);

        for (int i = 1; i <= n; i++) {
            System.out.println(f[i]);
        }
    }
}
